// 接口

// 1. 普通对象
interface User {
  // 必须属性
  name: string;
  age: number;
  sex: string;
  // 可选属性
  height?: number;
  // 只读属性
  readonly id: number;
  // 格外属性
  [propsName: string]: any;
}

const o: User = {
  id: 110,
  name: "张三",
  age: 18,
  sex: "男",
};

o.name = "小三三";
o.sex = "女";
// o.id = 1231231231231

const o1: User = {
  id: 120,
  name: "李四",
  age: 18,
  sex: "男",
  height: 180,

  like: ["狂阶", "打球", "干饭"],
  qwe: 1,
  哈哈: 23,
};

// 2. 接口函数

// interface Add {
//   (x: number, y?: number): number;
// }

// const add123: Add = (x: number, y?: number): number => {
//   if (typeof y === "number") {
//     return x + y;
//   } else {
//     return x;
//   }
// };

// interface Add {
//   (x: number, y: number): number;
// }

// const add123 = (x: number, y = 10): number => {
//   if (typeof y === "number") {
//     return x + y;
//   } else {
//     return x;
//   }
// };

// add123(1);
// add123(1, 12);

// 3. 接口索引

// interface Arr {
//   [propsName: number]: string;
// }

// const arr: (number | boolean)[] = [1, 2, 3, 4, true, false];

// const arr1: Arr = ["a", "b", "c"];
// const arr2: Array<boolean> = [true, false];

// 类接口
interface IPerson {
  num: number
  flag: boolean
  str: string
  name: string
}

class Person implements IPerson {
  num: number
  flag: boolean
  str: string
  name: string
  // 构造器
  constructor(num: number, flag: boolean, str: string) {
    this.num = num
    this.flag = flag
  }
}

new Person(1, true, "123");
